package Misil;

import java.io.Serializable;

import Misil.Comportamientos.*;
import Utilidades.CalculadoraDeMisiles;
import Utilidades.Logger;

/**
 * @brief SuperClase que define los parametros comunes a misil aliado y misil enemigo.
 * @author Marcelo
 * @version 1.0
 * @created 17-jul-2012 09:08:28 p.m.
 */
public class Misil implements Serializable{

	//Campos de la clase Misil
	protected boolean alineacionBelica;
	protected boolean destruido;
	protected double objetivo[];
	protected double posicion[];
	protected ComportamientoMisilAliado comportamiento;
	protected int velocidad;
	protected String ID;
	protected static int cantidadMisiles=0;
	protected boolean sigueEnElAireState=false;
	
	/**
	 * Constructor predeterminado de la clase Misil
	 */
	public Misil(){
	    posicion = new double[3];
		posicion[0]=0;
		posicion[1]=0;
		posicion[2]=0;
		velocidad = 0;
		destruido = false;
		alineacionBelica = false;
		ID="unknown";
		//generarID();
		destruido=false;
	}

	
	/**
	 * @brief Funcion que devuelve un String con informacion util sobre este misil.
	 */
	public String toString(){
		String alineacion="";
		if(alineacionBelica==true){alineacion="Aliado";}
		else alineacion="Enemigo";
		
		double[] objetivo = (double[])comportamiento.getObjetivo();
		
		String texto=ID+": "+alineacion+"  |Posicion: ("+posicion[0]+", "+posicion[1]+", "+ posicion[2]+
				")  |velocidad: |"+velocidad+"|  ["+
				CalculadoraDeMisiles.redondear(comportamiento.getVectorDeVelocidad()[0],2)+";"+
				CalculadoraDeMisiles.redondear(comportamiento.getVectorDeVelocidad()[1],2)+";"+
				CalculadoraDeMisiles.redondear(comportamiento.getVectorDeVelocidad()[2],2)+"]"+
				"   Objtv: ["+objetivo[0]+";"+objetivo[1]+";"+objetivo[2]+"]";
		return texto;
	}
	

	/**
	 * @brief Funcion que termina con la vida del misil al poner la variable "destruido"
	 * 		  en true. El hilo del misil checkea esta variable para saber si seguir vivo o no.
	 */
	public void explotar(){
		destruido = true;
		System.err.println(this.getID()+": BoOoOoM!!");
		Logger.escribir(this.getID()+": BoOoOoM!!");
	}

	/**
	 * @brief Funcion que devuelve la posicion actual de este misil.
	 * @return posicion actual del misil.
	 */
	public double[] getPosition(){
		double[] posicionADevolver=new double[posicion.length];
		System.arraycopy(posicion,0,posicionADevolver,0,posicion.length);
		return posicionADevolver;
	}

	
	/**
	 * Genera un ID alfanumerico para el misil.
	 * unknown significa que el misil no ha sido visto aun.
	 * @return
	 */
	public String generarID(){
		if(!ID.equals("unknown")){return ID;}
		if(alineacionBelica==true){
			ID="A"+cantidadMisiles;
		}
		else ID="E"+cantidadMisiles;
		cantidadMisiles=cantidadMisiles+1;
		return ID;
	}
	
	/**
	 * @brief Metodo que develve el valor del campo alineacionBelica
	 * @return 	{@code true} si se trata de un misil Aliado
	 * 			{@code false} se se trata de un misil enemigo
	 */
	public boolean getAlineacionBelica(){
		return alineacionBelica;
	}
	
	/**		  
	 * @brief Funcion del paso del tiempo. Es la funcion que debe llamar el entorno para que los misiles se muevan
	 */
	public void volar(){
		for(int i=0;i<3;i++)
			posicion[i]=CalculadoraDeMisiles.redondear(posicion[i]+
					comportamiento.getVectorDeVelocidad()[i],2);//vectorVelocidad[i];
		
		//Si se sale del areade estudio debe explotar
		if(Math.sqrt(posicion[0]*posicion[0]+posicion[1]*posicion[1])>50000){explotar();}
		
		
		//Si toca el suelo debe explotar
		if(posicion[2]<0){
			destruido=true;
			if(((this.getPosition()[0]*this.getPosition()[0]+this.getPosition()[1]*this.getPosition()[1])<9999*9999)&&
					(!this.getAlineacionBelica())){
				System.err.println(this.getID()+": BOOM!  ["+this.getPosition()[0]+";"+this.getPosition()[1]+
					";"+this.getPosition()[2]+"]   BASE DESTRUIDA!");
				Logger.escribir("LA BASE FUE DESTRUIDA!!");
			}
			else System.err.println(this.getID()+": BOOM!  ["+this.getPosition()[0]+";"+this.getPosition()[1]+
					";"+this.getPosition()[2]+"]");
		}
	}
	

	
	/**
	 * @brief Metodo que devuelve el ID del misil
	 * @return ID del misil
	 */
	public String getID(){
		return ID;
	}
	
	/**
	 * @brief Metodo que devuelve un valor booleano que indica si este misil fue
	 * 		  destruido o no.
	 * @return
	 */
	public boolean getDestruido(){
		return destruido;
	}
	
	/**
	 * @brief Funcion que devuelve el patron comportamiento de vuelo del misil aliado actual
	 * @return tipo de comportamiento del misil aliado
	 */
	public ComportamientoMisilAliado getComportamiento(){
		return comportamiento;
	}
	
	/**
	 * @brief Metodo que establece una nueva posicion para el misil.
	 * @param posicion
	 */
	public void setPosicion(double[] posicion){
		this.posicion=posicion;
	}
	
	
	public boolean getsigueEnElAireState(){
		return sigueEnElAireState;
	}
	
	
	public void setsigueEnElAireState(){
		sigueEnElAireState=true;
	}
	
}